CloudFormation で AWS Chatbot と CloudWatch Alarm を定義してSlackにアラート通知してみた
先日、AWS Chatbotが一般公開されました。
本記事では、CloudFormationでAWS Chatbotを作成してSlackにCloudWatch Alarmを通知してみます。 CloudWatch AlarmではLambdaのErrorsを監視対象にしました。
手動ポチポチもいいけど、CloudFormationで作るのもいいですよね!
監視対象のLambdaを作成する
適当なLambdaを作成します。関数名はmanulaly-test-function
にしています。絶対にエラーが発生するようにしています。
def lambda_handler(event, context): raise NotImplementedError('for Lambda Error')
CloudWatch AlarmとSNSトピックを作成する
YAMLの作成
次のYAMLをcloudwatch_alarm.yml
として作成します。
AWSTemplateFormatVersion: "2010-09-09" Description: CloudWatch Alarm Sample Stack Resources: # CloudWatchアラーム用のSNSトピック CloudWatchAlarmForChatbotTopic: Type: AWS::SNS::Topic Properties: TopicName: cloudwatch-alarm-for-chatbot-topic # CloudWatchアラームの定義 LambdaFunctionErrorsAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmName: test-lambda-error-for-chatbot-alarm Namespace: AWS/Lambda Dimensions: - Name: FunctionName Value: manulaly-test-function MetricName: Errors ComparisonOperator: GreaterThanOrEqualToThreshold # 閾値以上 Period: 60 # 期間[s] EvaluationPeriods: 1 # 閾値を超えた回数 Statistic: Maximum # 最大 Threshold: 1 # 閾値 TreatMissingData: notBreaching # Errorsがない場合は良好として扱う AlarmActions: - !Ref CloudWatchAlarmForChatbotTopic # アラーム遷移時のアクション OKActions: - !Ref CloudWatchAlarmForChatbotTopic # OK遷移時のアクション Outputs: CloudWatchAlarmForChatbotTopicArn: Value: !Ref CloudWatchAlarmForChatbotTopic Export: Name: !Sub ${AWS::StackName}-CloudWatchAlarmForChatbotTopicArn
Outputs
でExportさせ、クロススタック参照で後述のYAMLファイルでこのSNSトピックを参照しています。
デプロイ
次のコマンドでデプロイします。
aws cloudformation deploy \ --template-file cloudwatch_alarm.yml \ --stack-name CloudWatchAlarmSampleStack
AWS Chatbotを作成する
Slackワークスペースの認証とワークスペースID取得
WebコンソールでAWS Chatbotにアクセスし、ワークスペースを追加します。下記のワークスペースIDはあとで必要なのでメモしておきます。
SlackチャンネルIDを取得
任意のチャンネルのリンクを取得します。
このリンクの最後の文字列を使います。下記例だとABCD1234
がチャンネルIDです。
https://classmethod.slack.com/archives/ABCD1234
YAMLの作成
次のYAMLをchatbot.yml
として作成します。ワークスペースIDとチャンネルIDは外部から渡すようにしました。
AWSTemplateFormatVersion: "2010-09-09" Description: CloudWatch Alarm Sample Stack Parameters: TargetWorkspaceId: Type: String TargetChannelId: Type: String Resources: TestChatbot: Type: AWS::Chatbot::SlackChannelConfiguration Properties: ConfigurationName: TestChatbotForCloudFormation IamRoleArn: !GetAtt ChatbotIamRole.Arn LoggingLevel: INFO SlackChannelId: !Ref TargetChannelId SlackWorkspaceId: !Ref TargetWorkspaceId SnsTopicArns: - Fn::ImportValue: !Sub CloudWatchAlarmSampleStack-CloudWatchAlarmForChatbotTopicArn ChatbotIamRole: Type: AWS::IAM::Role Properties: RoleName: test-chatbot-iam-role AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: chatbot.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: test-chatbot-iam-policy PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - cloudwatch:Describe* - cloudwatch:Get* - cloudwatch:List* Resource: - "*"
デプロイ
次のコマンドでデプロイします。TargetWorkspaceId
とTargetChannelId
にワークスペースIDとチャンネルIDを指定します。
aws cloudformation deploy \ --template-file chatbot.yml \ --stack-name ChatbotSampleStack \ --capabilities CAPABILITY_NAMED_IAM \ --parameter-overrides TargetWorkspaceId=XYZXYZ TargetChannelId=ABCD1234
手動でチャンネルを追加している場合、このコマンドは失敗するのでご注意ください。
デプロイ完了
下記のようにAWS Chatbotのチャンネル設定ができました。
動作確認する
Lambdaエラーを発生させる
Lambdaを手動実行し、エラー発生させます。
Slackに通知がくる!
エラー発生時に通知が来ました。
OK状態に戻ったときにも通知がきました。バッチリですね!
さいごに
サクッと作れました。AWS Chatbotをどんどん活用していきたいです。